let id = 0;

class Dep {
  constructor() {
    // 属性的dep要收集watcher
    this.id = id++;

    // 存放当前属性对应的watcher
    this.subs = [];
  }

  depend() {
    // this.subs.push(Dep.target); 这样写会重复
    // 让watcher记住dep。既要watcher不重复，又要单向关系dep->watcher
    Dep.target.addDep(this);

    // dep和watcher是一个多对多的关系（一个属性可以在多个组件中的加入，一个组件中由多个属性组成）
  }

  addSub(watcher) {
    this.subs.push(watcher);
  }

  notify() {
    // 告诉watcher要更新了
    this.subs.forEach((watcher) => watcher.update());
  }
}

Dep.target = null;

let stack = [];
// 渲染时入栈
export function pushTarget(watcher) {
  stack.push(watcher);
  Dep.target = watcher;
}
// 渲染完后出栈
export function popTarget() {
  stack.pop();
  Dep.target = stack[stack.length - 1];
}

export default Dep;
